home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
data
/
happypas
/
life.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-11-30
|
4KB
|
111 lines
{*********************************************************************
* *** Rペントミノによる ライフゲーム *** *
* 60 × 19 の宇宙で Rペントミノ を 変化させると *
* 155世代目より6世代単位で繰り返す形に落ち着く *
* *
* HAPPyのサンプルプログラム *
* (作者 浅野比富美 Public Domain Software) *
*********************************************************************}
program LifeGame(input,output) ;
const Xmax = 61 ; { x軸(横軸の最大値 }
Ymax = 20 ; { y軸(縦軸の最大値 }
type xRange = 0..Xmax ; { x軸の範囲 (1~60までを使う) }
yRange = 0..Ymax ; { y軸の範囲 (1~19までを使う) }
var CurUniv , PreUniv : array[xRange,yRange] of Boolean ;
{ Current Universe : 現在の宇宙 Previous Universe :1世代前の宇宙 }
i : integer ; { 世代カウンタ }
x : xRange ; { for文制御変数 }
y : yRange ; { for文制御変数 }
{************************}
{* x行y桁にカーソル移動 *}
{************************}
procedure gotoxy(x{行},y{桁}:integer);
type string = packed array[1..2] of char ;
var strX,strY: string ;
procedure make(n:integer; var str: string) ;
begin
str[1] := chr(n div 10 + ord('0')) ;
str[2] := chr(n mod 10 + ord('0')) ;
end {make} ;
begin {gotoxy}
make(x,strX) ;
make(y,strY) ;
write(chr(27),'[',strX,';',strY,'H')
end {gotoxy} ;
{************************}
{* 初期設定処理 *}
{************************}
procedure Init ;
var x : xRange ;
y : yRange ;
begin
for x := 0 to Xmax do { 全面クリア }
for y := 0 to Ymax do
CurUniv[x,y] := false ;
PreUniv := CurUniv ; { 0世代出力のため }
{ Rペントミノ }
CurUniv[26, 8] := true ; CurUniv[27, 8] := true ; { ○○ }
CurUniv[27, 9] := true ; CurUniv[27,10] := true ; { ○○ }
CurUniv[28, 9] := true { ○ }
end {Init} ;
{************************}
{* 次世代状態作成 *}
{************************}
{ ----- ライフゲーム創始者 コンウェイが考案した生成消滅規則 -----
現在が死の状態にあるセルは3性交渉によって新しく生に生まれ変わる。
周囲の生のセルが3より多くても少なくても新しい生命は誕生しない。
一方現在が生の状態にあるセルが次時刻でも延命するのは、周囲にほどほどの
生命がある場合、すなわち周囲の生のセルの個数が2または3の時の限る。
周囲にセルが2個未満であれば、過疎によって死に至る。また周囲に生のセルが
4個以上あれば、過密によって死に至る。}
procedure Next ;
var x : xRange ;
y : yRange ;
count : 0..8 ; { 周囲のセル数 }
begin
PreUniv := CurUniv ; { 現在の宇宙を退避 }
for x := 1 to Xmax-1 do
for y := 1 to Ymax-1 do
begin
count := ord(PreUniv[x-1,y-1]) + ord(PreUniv[x-1,y ])
+ ord(PreUniv[x-1,y+1]) + ord(PreUniv[x ,y-1])
+ ord(PreUniv[x ,y+1]) + ord(PreUniv[x+1,y-1])
+ ord(PreUniv[x+1,y ]) + ord(PreUniv[x+1,y+1]) ;
if PreUniv[x,y] then CurUniv[x,y] := (count=2) or (count=3)
else CurUniv[x,y] := (count=3)
end
end {Next} ;
{************************}
{* メイン処理 *}
{************************}
begin {main}
Init ; { 初期設定 }
page ; { 画面クリア }
writeln('************* Rペントミノによる ライフゲーム *************') ;
for i:=0 to 155+6 do { 155世代目から6世代で終わり }
begin
gotoxy(2,1) ;
writeln(i:3,'世代');
for y := 0 to Ymax do
begin
for x := 0 to Xmax do
if CurUniv[x,y] <> PreUniv[x,y] then { 前回と異なっている時 }
begin
gotoxy(3+y,x+1) ; { 対応場所にカーソルを移動 }
if CurUniv[x,y] then write('O') { 生 }
else write(' ') { 死 }
end
end ;
Next { 次世代を作成 }
end
end.